package com.adingxiong.cft.design;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * @ClassName StrategyMode
 * @Description  设计模式---策略模式  ，用于代替传统的if else ，当业务过于复杂，重复使用if else 让
 *      代码显得过于冗余  可以采用策略模式进行优化
 *
 *      策略模式  ：
 *      接口   +    实现类    +  逻辑派生
 *
 *
 * @Author xiongchao
 * @Date 2020/6/24 14:05
 **/
@Service
public class StrategyMode {


    /**
     * 业务逻辑分派Map
     * Function为函数式接口，下面代码中 Function<String, String> 的含义是接收一个Stirng类型的变量，返回一个String类型的结果
     * 单条件
     */
    private Map<String,Function<String,String>> checkResultDispatcher = new HashMap<>();

    @Autowired
    private IDerive derive;

    /**
     *  初始化  业务逻辑分派的 Map
     *  其中value存放的是  lamada表达式
     */
    @PostConstruct
    public void setCheckResultDispatcherInit (){
        /*checkResultDispatcher.put("分流1", order -> String.format("对%s执行对应的业务逻辑1" , order));
        checkResultDispatcher.put("分流2", order -> String.format("对%s执行对应的业务逻辑2" , order));
        checkResultDispatcher.put("分流3", order -> String.format("对%s执行对应的业务逻辑3" , order));
        checkResultDispatcher.put("分流4", order -> String.format("对%s执行对应的业务逻辑4" , order));
        checkResultDispatcher.put("分流5", order -> String.format("对%s执行对应的业务逻辑5" , order));
        checkResultDispatcher.put("分流6", order -> String.format("对%s执行对应的业务逻辑6" , order));*/

        checkResultDispatcher.put("业务1" , order -> derive.part1(order));
        checkResultDispatcher.put("业务2" , order -> derive.part2(order));
        checkResultDispatcher.put("业务3" , order -> derive.part3(order));
        checkResultDispatcher.put("业务4" , order -> derive.part4(order));
    }


    public String getCheckResultSuper(String order){
        Function<String,String> result = checkResultDispatcher.get(order);
        if(result != null){
            return result.apply(order);
        }
        return "不在处理的业务范围你之内";
    }


}
